home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / os2 / vidmgr13.zip / QMENU.ZIP / QMENU.C < prev    next >
C/C++ Source or Header  |  1996-10-03  |  5KB  |  240 lines

  1. /*
  2.  *  QuickMenu VidMgr demonstration application.
  3.  *
  4.  *  Written in June 1996 by Andrew Clarke and released to the public domain.
  5.  *
  6.  *  Currently assumes 80x25 video output, but may be rewritten to
  7.  *  recognise other video dimensions.
  8.  */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include "vidmgr.h"
  14. #include "vioimage.h"
  15.  
  16. #define maxx  vm_getscreenwidth()
  17. #define maxy  vm_getscreenheight()
  18.  
  19. #define PROG     "QuickMenu"
  20. #define VERSION  "1.2"
  21.  
  22. #define MAXITEMS 12
  23.  
  24. typedef struct
  25. {
  26.     char desc[40];
  27.     char cmd[250];
  28. }
  29. MENUDATA;
  30.  
  31. static VIOIMAGE sysimage;
  32. static MENUDATA menudata[MAXITEMS];
  33. static int menuitems, curritem, olditem;
  34.  
  35. int qmenuLoadMenu(char *fnm)
  36. {
  37.     FILE *fp;
  38.     int item, line;
  39.  
  40.     fp = fopen(fnm, "r");
  41.     if (fp == NULL)
  42.     {
  43.         perror(fnm);
  44.         return 0;
  45.     }
  46.  
  47.     item = 0;
  48.     line = 1;
  49.     while (item < MAXITEMS && !feof(fp))
  50.     {
  51.         char *p;
  52.         
  53.         if (fgets(menudata[item].desc, 40, fp) == NULL)
  54.         {
  55.             break;
  56.         }
  57.  
  58.         p = strrchr(menudata[item].desc, '\n');
  59.         if (p != NULL)
  60.         {
  61.             *p = '\0';
  62.         }
  63.  
  64.         if (*menudata[item].desc == '\0')
  65.         {
  66.             printf("%s(%d): Error! Expected description but found ''\n", fnm, line);
  67.             return 0;
  68.         }
  69.  
  70.         line++;
  71.         if (fgets(menudata[item].cmd, 250, fp) == NULL)
  72.         {
  73.             printf("%s(%d): Error! Expected command but reached end of file\n", fnm, line);
  74.             return 0;
  75.         }
  76.  
  77.         p = strrchr(menudata[item].cmd, '\n');
  78.         if (p != NULL)
  79.         {
  80.             *p = '\0';
  81.         }
  82.         
  83.         if (*menudata[item].cmd == '\0')
  84.         {
  85.             printf("%s(%d): Error! Expected command but found ''\n", fnm, line);
  86.             return 0;
  87.         }
  88.  
  89.         line++;
  90.         item++;
  91.     }
  92.  
  93.     fclose(fp);
  94.  
  95.     menuitems = item;
  96.  
  97.     return 1;
  98. }
  99.  
  100. void qmenuRun(void)
  101. {
  102.     int done, ch;
  103.     FILE *ofp;
  104.     char qmtmpfnm[12];
  105.     
  106. #if defined(OS2)
  107.     strcpy(qmtmpfnm, "$qmtemp.cmd");
  108. #elif defined(EMX)
  109.     if (_osmode == DOS_MODE)
  110.     {
  111.         strcpy(qmtmpfnm, "$qmtemp.bat");
  112.     }
  113.     else
  114.     {
  115.         strcpy(qmtmpfnm, "$qmtemp.cmd");
  116.     }
  117. #else
  118.     strcpy(qmtmpfnm, "$qmtemp.bat");
  119. #endif
  120.  
  121.     vm_attrib(24, (char) (7 + curritem), 56, (char) (7 + curritem), vm_mkcolor(WHITE, BLACK));
  122.  
  123.     done = 0;
  124.     while (!done)
  125.     {
  126.         if (curritem != olditem)
  127.         {
  128.             vm_attrib(24, (char) (7 + olditem), 56, (char) (7 + olditem), vm_mkcolor(BLACK, LIGHTGRAY));
  129.             vm_attrib(24, (char) (7 + curritem), 56, (char) (7 + curritem), vm_mkcolor(WHITE, BLACK));
  130.         }
  131.  
  132.         while (!vm_kbhit())
  133.         {
  134.             /* nada */
  135.         }
  136.  
  137.         ch = vm_getch();
  138.         switch (ch)
  139.         {
  140.         case 0x3b00:    /* F1 */
  141.             /* nada */
  142.             break;
  143.  
  144.         case 0x4800:    /* up arrow */
  145.             olditem = curritem;
  146.             if (curritem != 0)
  147.             {
  148.                 curritem--;
  149.             }
  150.             break;
  151.  
  152.         case 0x5000:    /* down arrow */
  153.             olditem = curritem;
  154.             if (curritem != menuitems - 1)
  155.             {
  156.                 curritem++;
  157.             }
  158.             break;
  159.  
  160.         case 0x4700:    /* Home */
  161.             olditem = curritem;
  162.             curritem = 0;
  163.             break;
  164.  
  165.         case 0x4f00:    /* End */
  166.             olditem = curritem;
  167.             curritem = menuitems - 1;
  168.             break;
  169.  
  170.         case 0x001b:    /* Escape */
  171.         case 0x3d00:    /* F3 */
  172.         case 0x4400:    /* F10 */
  173.         case 0x6b00:    /* Alt+F4 */
  174.         case 0x2d00:    /* Alt+X */
  175.             remove(qmtmpfnm);
  176.             done = 1;
  177.             break;
  178.  
  179.         case 0x000d:    /* Enter */
  180.             ofp = fopen(qmtmpfnm, "w");
  181.             fputs("@echo off\n", ofp);
  182.             fputs(menudata[curritem].cmd, ofp);
  183.             fputs("\n", ofp);
  184.             fputs("qm\n", ofp);
  185.             fclose(ofp);
  186.             done = 1;
  187.             break;
  188.             
  189.         default:
  190.             break;
  191.         }
  192.     }
  193. }
  194.  
  195. void qmenuTerm(void)
  196. {
  197.     vioImageRestore(&sysimage, 1, 1);
  198.     vioImageTerm(&sysimage);
  199.     vm_gotoxy(vm_startup.xpos, vm_startup.ypos);
  200.     vm_done();
  201. }
  202.  
  203. void qmenuInit(void)
  204. {
  205.     int item;
  206.  
  207.     printf("\n" PROG " " VERSION "; Written in June 1996 by Andrew Clarke.\n");
  208.     printf("Released to the public domain.\n");
  209.  
  210.     vm_init();
  211.     vioImageDefaults(&sysimage);
  212.     vioImageInit(&sysimage, maxx, maxy);
  213.     vioImageSave(&sysimage, 1, 1);
  214.  
  215.     if (qmenuLoadMenu("qmenu.mnu") != 1)
  216.     {
  217.         vm_done();
  218.         exit(EXIT_FAILURE);
  219.     }
  220.  
  221.     vm_setcursorstyle(CURSORHIDE);
  222.  
  223.     vm_attrib(22, 6, 62, 21, vm_mkcolor(LIGHTGRAY, BLACK));
  224.     vm_paintclearbox(20, 5, 60, 20, vm_mkcolor(BLACK, LIGHTGRAY));
  225.     vm_frame(23, 6, 57, 19, vm_mkcolor(BLACK, LIGHTGRAY), vm_frame_double);
  226.  
  227.     for (item = 0; item < menuitems; item++)
  228.     {
  229.         vm_puts(25, (char) (7 + item), menudata[item].desc);
  230.     }
  231. }
  232.  
  233. int main(void)
  234. {
  235.     qmenuInit();
  236.     qmenuRun();
  237.     qmenuTerm();
  238.     return 0;
  239. }
  240.